<script setup>
import { ref, onMounted } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { showToast } from 'vant'
import { getProDetailApi, getProCommentApi } from '@/api/product'
import { addToCartApi, getCartTotalApi } from '@/api/cart'
import { useLoginConfirm } from '@/composables/useLoginConfirm'
import defaultImg from '@/assets/default-avatar.png'
import CountBox from '@/components/CountBox.vue'

const route = useRoute()
const router = useRouter()
const { loginConfirm } = useLoginConfirm() // 引入登录确认弹窗

const detailInfo = ref({}) // 商品详情
const commentInfo = ref([]) // 商品评价
const images = ref([]) // 商品轮播图
const current = ref(0) // 当前轮播图索引
const totalComment = ref(0) // 商品评价总数
const showPanel = ref(false) // 控制弹层显示与隐藏，明确初始化为布尔值
const cartState = ref('cart') // 标记弹窗状态
const addCount = ref(1) // 加入购物车数量
const cartTotal = ref(0) // 购物车商品总数

const onChange = (index) => {
  current.value = index
}

const getProDetail = async () => {
  const { data: { detail } } = await getProDetailApi(route.params.id) // 获取商品详情,动态路由传参用route.params.id获取
  detailInfo.value = detail
  images.value = detail.goods_images
}

const getProComment = async () => {
  const { data: { list, total } } = await getProCommentApi(route.params.id, 3) // 获取商品评价
  commentInfo.value = list.map(item => ({
    ...item,
    displayScore: item.score / 2 // 添加计算后的字段
  }))
  totalComment.value = total
}

const addToCartPanel = () => {
  cartState.value = 'cart'
  showPanel.value = true
}

const buyNowPanel = () => {
  cartState.value = 'buyNow'
  showPanel.value = true
}

const getCartTotal = async () => {
  const { data } = await getCartTotalApi()
  cartTotal.value = data.cartTotal
  // 该处有bug，但是不会影响功能，只需要在正式开发时去更新库存和已售，后端目前写死数据，无法修改
}

const addToCart = async () => {
  if (loginConfirm()) return // 判断是否登录，未登录则跳转到登录页

  // 发送请求加入购物车，该处的detailInfo.value.skuList[0].goods_sku_id是简化后的版本，正常需要选择规格后再调用接口
  const { data } = await addToCartApi(route.params.id, addCount.value, detailInfo.value.skuList[0].goods_sku_id)
  cartTotal.value = data.cartTotal
  showToast('加入购物车成功')
  showPanel.value = false
}

const buyNow = () => {
  if (loginConfirm()) return // 判断是否登录，未登录则跳转到登录页

  router.push({
    path: '/pay',
    query: {
      mode: 'buyNow',
      goodsId: route.params.id,
      goodsNum: addCount.value,
      goodsSkuId: detailInfo.value.skuList[0].goods_sku_id
    }
  })
}

onMounted(() => {
  getProDetail()
  getProComment()
  getCartTotal()
})
</script>

<template>
  <div class="prodetail">
    <van-nav-bar fixed title="商品详情页" left-arrow @click-left="router.back()"/>

    <van-swipe :autoplay="5000" @change="onChange">
      <van-swipe-item v-for="image in images" :key="image.file_id">
        <img :src="image.external_url" :alt="image.file_name"/>
      </van-swipe-item>

      <template #indicator>
        <div class="custom-indicator">{{ current + 1 }} / {{ images.length }}</div>
      </template>
    </van-swipe>

    <!-- 商品说明 -->
    <div class="info">
      <div class="title">
        <div class="price">
          <span class="now">￥{{ detailInfo.goods_price_min }}</span>
          <span class="oldprice">￥{{ detailInfo.goods_price_max }}</span>
        </div>
        <div class="sellcount">已售{{ detailInfo.goods_sales }}件</div>
      </div>
      <div class="msg text-ellipsis-2">{{ detailInfo.goods_name }}</div>

      <div class="service">
        <div class="left-words">
          <span><van-icon name="passed"/>七天无理由退货</span>
          <span><van-icon name="passed"/>48小时发货</span>
        </div>
        <div class="right-icon">
          <van-icon name="arrow"/>
        </div>
      </div>
    </div>

    <!-- 商品评价 -->
    <div class="comment">
      <div class="comment-title">
        <div class="left">商品评价({{ totalComment }}条)</div>
        <div class="right">查看更多
          <van-icon name="arrow"/>
        </div>
      </div>
      <div class="comment-list">
        <div class="comment-item" v-for="item in commentInfo" :key="item.comment_id">
          <div class="top">
            <img :src="item.user.avatar_url || defaultImg" :alt="item.user.nick_name">
            <div class="name">{{ item.user.nick_name }}</div>
            <van-rate :size="16" v-model="item.displayScore" color="#ffd21e" void-icon="star" void-color="#eee"/>
          </div>
          <div class="content">
            {{ item.content }}
          </div>
          <div class="time">
            {{ item.create_time }}
          </div>
        </div>
      </div>
    </div>

    <!-- 商品描述 -->
    <div class="desc" v-html="detailInfo.content"></div>

    <!-- 底部 -->
    <div class="footer">
      <div @click="router.push('/')" class="icon-home">
        <van-icon name="wap-home-o"/>
        <span>首页</span>
      </div>
      <div @click="router.push('/cart')" class="icon-cart">
        <span v-if="cartTotal > 0" class="num">{{ cartTotal }}</span>
        <van-icon name="shopping-cart-o"/>
        <span>购物车</span>
      </div>
      <div @click="addToCartPanel" class="btn-add">加入购物车</div>
      <div @click="buyNowPanel" class="btn-buy">立即购买</div>
    </div>

    <!--  购物车和立即购买弹层  -->
    <van-action-sheet v-model:show="showPanel" :title="cartState === 'cart' ? '加入购物车' : '立即购买'">
      <div class="product">
        <div class="product-title">
          <div class="left">
            <img :src="detailInfo.goods_image" alt="">
          </div>
          <div class="right">
            <div class="price">
              <span>¥</span>
              <span class="nowprice">{{ detailInfo.goods_price_min }}</span>
            </div>
            <div class="count">
              <span>库存</span>
              <span>{{ detailInfo.stock_total }}</span>
            </div>
          </div>
        </div>
        <div class="num-box">
          <span>数量</span>
          <CountBox v-model:value="addCount" :stock-total="detailInfo.stock_total"></CountBox>
        </div>
        <div class="showbtn" v-if="addCount > 0 && detailInfo.stock_total > 0">
          <div class="btn" v-if="cartState === 'cart'" @click="addToCart">加入购物车</div>
          <div class="btn now" v-else @click="buyNow">立刻购买</div>
        </div>
        <div class="btn-none" v-else-if="addCount === 0 && detailInfo.stock_total > 0">请添加商品</div>
        <div class="btn-none" v-else>该商品已抢完</div>
      </div>
    </van-action-sheet>
  </div>
</template>

<style lang="less" scoped>
.prodetail {
  padding-top: 46px;

  ::v-deep .van-icon-arrow-left {
    color: #333;
  }

  img {
    display: block;
    width: 100%;
  }

  .custom-indicator {
    position: absolute;
    right: 10px;
    bottom: 10px;
    padding: 5px 10px;
    font-size: 12px;
    background: rgba(0, 0, 0, 0.1);
    border-radius: 15px;
  }

  .desc {
    width: 100%;
    overflow: scroll;

    ::v-deep img {
      display: block;
      width: 100% !important;
    }
  }

  .info {
    padding: 10px;
  }

  .title {
    display: flex;
    justify-content: space-between;

    .now {
      color: #fa2209;
      font-size: 20px;
    }

    .oldprice {
      color: #959595;
      font-size: 16px;
      text-decoration: line-through;
      margin-left: 5px;
    }

    .sellcount {
      color: #959595;
      font-size: 16px;
      position: relative;
      top: 4px;
    }
  }

  .msg {
    font-size: 16px;
    line-height: 24px;
    margin-top: 5px;
  }

  .service {
    display: flex;
    justify-content: space-between;
    line-height: 40px;
    margin-top: 10px;
    font-size: 16px;
    background-color: #fafafa;

    .left-words {
      span {
        margin-right: 10px;
      }

      .van-icon {
        margin-right: 4px;
        color: #fa2209;
      }
    }
  }

  .comment {
    padding: 10px;
  }

  .comment-title {
    display: flex;
    justify-content: space-between;

    .right {
      color: #959595;
    }
  }

  .comment-item {
    font-size: 16px;
    line-height: 30px;

    .top {
      height: 30px;
      display: flex;
      align-items: center;
      margin-top: 20px;

      img {
        width: 20px;
        height: 20px;
      }

      .name {
        margin: 0 10px;
      }
    }

    .time {
      color: #999;
    }
  }

  .footer {
    position: fixed;
    left: 0;
    bottom: 0;
    width: 100%;
    height: 55px;
    background-color: #fff;
    border-top: 1px solid #ccc;
    display: flex;
    justify-content: space-evenly;
    align-items: center;

    .icon-home, .icon-cart {
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      font-size: 14px;

      .van-icon {
        font-size: 24px;
      }
    }

    .btn-add,
    .btn-buy {
      height: 36px;
      line-height: 36px;
      width: 120px;
      border-radius: 18px;
      background-color: #ffa900;
      text-align: center;
      color: #fff;
      font-size: 14px;
    }

    .btn-buy {
      background-color: #fe5630;
    }
  }

  .footer .icon-cart {
    position: relative;
    padding: 0 6px;

    .num {
      z-index: 999;
      position: absolute;
      top: -2px;
      right: 0;
      min-width: 16px;
      padding: 0 4px;
      color: #fff;
      text-align: center;
      background-color: #ee0a24;
      border-radius: 50%;
    }
  }

  .product {
    .product-title {
      display: flex;

      .left {
        img {
          width: 90px;
          height: 90px;
        }

        margin: 10px;
      }

      .right {
        flex: 1;
        padding: 10px;

        .price {
          font-size: 14px;
          color: #fe560a;

          .nowprice {
            font-size: 24px;
            margin: 0 5px;
          }
        }
      }
    }

    .num-box {
      display: flex;
      justify-content: space-between;
      padding: 10px;
      align-items: center;
    }

    .btn, .btn-none {
      height: 40px;
      line-height: 40px;
      margin: 20px;
      border-radius: 20px;
      text-align: center;
      color: rgb(255, 255, 255);
      background-color: rgb(255, 148, 2);
    }

    .btn.now {
      background-color: #fe5630;
    }

    .btn-none {
      background-color: #cccccc;
    }
  }
}

.tips {
  padding: 10px;
}
</style>

<script>
export default {
  name: 'ProDetailIndex'
}
</script>
